home *** CD-ROM | disk | FTP | other *** search
- ; RLE coding
- ; Written by Malakhov K.A.
- ; Compile with TASM 3.0 or latter
- ; TASM RLE.ASM /MX /ZX /O
- ; CALL: rle_encode(char *buffinput,unsigned int inputlength,
- ; char *buffoutput);
- ; CALL: rle_decode(char *buffinput,unsigned int inputlength,
- ; char *buffoutput);
-
- model large
-
- PUBLIC _rle_encode
- PUBLIC _rle_decode
-
- .code
-
- _rle_encode PROC C FAR
- ARG buffi:dword,leng:word,buffo:dword
- USES bx,cx,dx,di,si,ds,es
- ; Initialization
- mov ax,leng
- mov cs:lng,ax
-
- mov ax,word ptr buffi+2
- mov ds,ax
- mov ax,word ptr buffo+2
- mov es,ax
- mov si,word ptr buffi
- mov di,word ptr buffo
-
- mov cs:count1,di
- mov cs:count2,0
- mov cs:begflg,1
- inc di
- cld
- ; Loop
- ARH_01: mov cl,3fh
- mov cs:count3,0
- ARH_02: lodsb
- mov bx,leng
- dec bx
- mov leng,bx
- cmp bx,3
- ja ARH_03
- jmp ARH_kon
- ; Compare with next byte
- ARH_03: cmp al,byte ptr ds:[si]
- je ARH_04
- ; Not equal.
- ARH_031: mov cs:begflg,0
- stosb
- inc word ptr cs:count2
- mov ax,word ptr cs:count2
- cmp ax,64000
- jbe ARH_0311
- jmp ARH_09
- ARH_0311: inc byte ptr cs:count3
- dec cl
- jnz ARH_02
- ; Set controll code for not compressed block
- mov dl,cs:count3
- or dl,10000000b
- mov bx,cs:count1
- mov es:[bx],dl
- inc word ptr cs:count2
- mov cs:count1,di
- inc di
- mov cs:begflg,1
- jmp ARH_01
-
- ARH_032: dec di
- jmp short ARH_041
- ; Compare with third byte
- ARH_04: cmp al,byte ptr ds:[si+1]
- jne ARH_031
- dec si
- inc word ptr leng
- cmp cs:begflg,1
- je ARH_032
- ; Set not compressed block
- mov dl,cs:count3
- or dl,10000000b
- mov bx,cs:count1
- mov es:[bx],dl
- inc word ptr cs:count2
- ; Begin compressed block
- ARH_041: mov cl,3fh
- mov cs:count3,0
- ARH_05: lodsb
- mov bx,leng
- dec bx
- mov leng,bx
- cmp bx,1
- jbe ARH_06
- cmp al,byte ptr ds:[si]
- jne ARH_06
- inc byte ptr cs:count3
- dec cl
- jnz ARH_05
- mov dl,cs:count3
- mov es:[di],dl
- inc di
- inc word ptr cs:count2
- mov es:[di],al
- inc word ptr cs:count2
- inc di
- mov cs:count1,di
- jmp ARH_041
- ARH_06: mov dl,cs:count3
- inc dl
- mov es:[di],dl
- inc di
- inc word ptr cs:count2
- mov es:[di],al
- inc word ptr cs:count2
- inc di
- mov cs:count1,di
- inc di
- mov cs:begflg,1
- jmp ARH_01
- ARH_kon: stosb
- inc word ptr cs:count2
- mov cx,cs:count2
- cmp cx,64000
- ja ARH_09
- ; Save the rest of bytes
- inc byte ptr cs:count3
- mov cx,leng
- ARH_07: cmp cx,1
- jb ARH_08
- ARH_071: movsb
- inc word ptr cs:count2
- mov ax,cs:count2
- cmp ax,cs:lng
- ja ARH_09
-
- inc byte ptr cs:count3
- dec cx
- jnz ARH_071
- ARH_08:
- mov al,cs:count3
- or al,10000000b
- mov bx,cs:count1
- mov es:[bx],al
- inc word ptr cs:count2
-
- mov ax,cs:cs:count2
- ret
-
- ARH_09: xor ax,ax
- ret
-
- count1 dw ? ; Ptr for controll code
- count2 dw ? ; Total bytes counter
- count3 db ? ; Bytes counter in block
- begflg db ?
- lng dw ?
-
- _rle_encode ENDP
-
- ; Decompression
- _rle_decode PROC C FAR
- ARG buffi:dword,leng:word,buffo:dword
- USES bx,cx,dx,di,si,ds,es
- ; Init
- mov ax,word ptr buffi+2
- mov ds,ax
- mov ax,word ptr buffo+2
- mov es,ax
- mov si,word ptr buffi
- mov di,word ptr buffo
-
- mov cs:count1,di
- cld
- ; Load byte
- DARH_01: lodsb
- mov bx,leng
- dec bx
- mov leng,bx
- cmp bx,0
- je DARH_kon
- ; Check block
- test al,10000000b
- jz DARH_02
- ; Do not compressed
- and al,01111111b
- mov cl,al
- xor ch,ch
- DARH_011: movsb
- mov bx,leng
- dec bx
- mov leng,bx
- cmp bx,0
- je DARH_kon
- dec cx
- jnz DARH_011
- jmp short DARH_01
- ; Compressed
- DARH_02: mov cl,al
- xor ch,ch
- lodsb
- mov bx,leng
- dec bx
- mov leng,bx
- cmp bx,0
- je DARH_kon
- rep stosb
- jmp short DARH_01
- DARH_kon: mov ax,di
- sub ax,cs:count1
- ret
-
- _rle_decode ENDP
-
- END
-